package mysql8学习.初级.第13章_约束;

/**
 * 开发场景
 * 问题1：如果两个表之间有关系（一对一、一对多），
 * 比如：员工表和部门表（一对多），它们之间是否一定要建外键约束？
 * 答：不是的
 *
 * **问题2：建和不建外键约束有什么区别？**
 *
 * 答：建外键约束，你的操作（创建表、删除表、添加、修改、删除）会受到限制，从语法层面受到限制。
 * 例如：在员工表中不可能添加一个员工信息，它的部门的值在部门表中找不到。
 * 不建外键约束，你的操作（创建表、删除表、添加、修改、删除）不受限制，要保证数据的`引用完整性`，
 * 只能依`靠程序员的自觉`，或者是`在Java程序中进行限定`。
 * 例如：在员工表中，可以添加一个员工的信息，它的部门指定为一个完全不存在的部门。
 *
 * **问题3：那么建和不建外键约束和查询有没有关系？**
 * 答：没有
 *
 *   在 MySQL 里，外键约束是有成本的，需要消耗系统资源。
 *   对于大并发的 SQL 操作，有可能会不适合。
 *   比如大型网站的中央数据库，可能会`因为外键约束的系统开销而变得非常慢`。
 *   所以，MySQL 允许你不使用系统自带的外键约束，在`应用层面`完成检查数据一致性的逻辑。
 *   也就是说，即使你不用外键约束，也要想办法通过应用层面的附加逻辑，
 *   来实现外键约束的功能，确保数据的一致性。
 *
 * ### 阿里开发规范
 * 【`强制`】不得使用外键与级联，一切外键概念必须在应用层解决。
 *
 * 说明：（概念解释）学生表中的 student_id 是主键，
 * 那么成绩表中的 student_id 则为外键。
 * 如果更新学生表中的 student_id，同时触发成绩表中的 student_id 更新，即为级联更新。
 * 外键与级联更新适用于`单机低并发`，不适合`分布式`、`高并发集群`；
 * 级联更新是强阻塞，存在数据库`更新风暴`的风险；外键影响数据库的`插入速度`。
 *
 *
 * 总的来说  外键不会增加查询效率  而且还会增加  增删改查  的速度，
 *      所以我们一般都在应用层实现外键的功能
 *
 */
public class H4_外键约束适用场景 {
}
